// ProjectName: go-learn-demo
// PackageName: reflectybxb
// Description:
// Author: hy.bai
// Date: 2025-08-13, 星期三 21:46

package reflectybxb

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func (p *Person) SetAge(age int) {
	p.Age = age
}

func (p *Person) GetName() string {
	return p.Name
}

func (p *Person) PrintInfo() {
	fmt.Println(p)
}

// 反射调用无参方法
func TestStructReflectMethod1() {
	p := &Person{
		Name: "hy.bai",
		Age:  18,
	}
	pVal := reflect.ValueOf(p)
	// 注意：通过反射MethodByName方法获取Method进行调用时，获取到的方法必须是公共方法(首字母必须大写)
	pVal.MethodByName("PrintInfo").Call(nil)
}

func TestStructReflectMethod2() {
	p := &Person{
		Name: "hy.bai",
		Age:  18,
	}
	pVal := reflect.ValueOf(p)
	// 注意：通过反射MethodByName方法获取Method进行调用时，获取到的方法必须是公共方法(首字母必须大写)
	params := make([]reflect.Value, 1)
	params[0] = reflect.ValueOf(100)
	pVal.MethodByName("SetAge").Call(params)
	fmt.Println(p)
}

func TestStructReflectMethod3() {
	p := &Person{
		Name: "hy.bai",
		Age:  18,
	}
	pVal := reflect.ValueOf(p)
	// 注意：通过反射MethodByName方法获取Method进行调用时，获取到的方法必须是公共方法(首字母必须大写)
	values := pVal.MethodByName("GetName").Call(nil) // 返回值为：[]reflect.Value
	fmt.Println(values[0])
}
